package com.aiassistant.controller;

import com.aiassistant.model.AIModelInterface;
import com.aiassistant.model.Assistant;
import com.aiassistant.model.ModelManager;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.concurrent.CompletableFuture;

/**
 * 现代化主界面控制器
 */
public class ModernMainController implements Initializable {
    
    @FXML
    private VBox chatNavButton;
    
    @FXML
    private VBox appNavButton;
    
    @FXML
    private VBox favoriteNavButton;
    
    @FXML
    private VBox settingsNavButton;
    
    @FXML
    private TextField searchField;
    
    @FXML
    private Label myTabButton;
    
    @FXML
    private Label featuredTabButton;
    
    @FXML
    private Label careerTabButton;
    
    @FXML
    private VBox assistantListContainer;
    
    @FXML
    private Button createAssistantButton;
    
    @FXML
    private StackPane contentContainer;
    
    @FXML
    private ScrollPane chatScrollPane;
    
    @FXML
    private VBox chatMessagesContainer;
    
    @FXML
    private Button attachButton;
    
    @FXML
    private TextArea userInputArea;
    
    @FXML
    private ProgressIndicator progressIndicator;
    
    @FXML
    private Button sendButton;
    
    @FXML
    private BorderPane settingsPane;
    
    private ObservableList<Assistant> assistants = FXCollections.observableArrayList();
    private Assistant currentAssistant;
    private ModelManager modelManager;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        modelManager = ModelManager.getInstance();
        
        // 初始化助手列表
        initializeAssistants();
        
        // 设置导航按钮事件
        setupNavButtons();
        
        // 设置分类标签事件
        setupTabButtons();
        
        // 设置消息发送和图片上传事件
        setupMessageHandling();
        
        // 添加欢迎消息
        Platform.runLater(() -> {
            addMessageToChat("AI助手", "你好！我是基于现代设计的AI助手。请输入消息或上传图片，我会尽力提供帮助。", true);
        });
    }
    
    /**
     * 初始化助手列表
     */
    private void initializeAssistants() {
        // 清空并重置助手列表容器
        assistantListContainer.getChildren().clear();
        
        // 添加默认助手
        Assistant defaultAssistant = new Assistant("default", "默认助手", 
            "通用AI助手，可回答各类问题", "/com/aiassistant/images/assistants/default.png", "我的", "DeepSeek Chat");
        
        // 添加以太坊开发助手
        Assistant ethDevAssistant = new Assistant("eth_dev", "以太坊开发大师", 
            "专注区块链技术问题", "/com/aiassistant/images/assistants/ethereum.png", "职业", "DeepSeek Chat");
        
        // 添加区块链专家
        Assistant blockchainAssistant = new Assistant("blockchain", "区块链开发专家", 
            "区块链技术与应用开发指导", "/com/aiassistant/images/assistants/blockchain.png", "职业", "DeepSeek Chat");
        
        // 添加到集合
        assistants.addAll(defaultAssistant, ethDevAssistant, blockchainAssistant);
        
        // 默认选中第一个助手
        currentAssistant = defaultAssistant;
        
        // 为每个助手创建卡片并添加到容器
        for (Assistant assistant : assistants) {
            if ("我的".equals(assistant.getCategory())) {
                Node card = createAssistantCard(assistant);
                assistantListContainer.getChildren().add(card);
            }
        }
        
        // 设置创建按钮事件
        createAssistantButton.setOnAction(event -> createNewAssistant());
    }
    
    /**
     * 创建助手卡片
     */
    private Node createAssistantCard(Assistant assistant) {
        VBox card = new VBox(10);
        card.getStyleClass().add("assistant-card");
        
        // 头部行：头像和名称
        HBox header = new HBox(10);
        header.setAlignment(javafx.geometry.Pos.CENTER_LEFT);
        
        // 加载助手头像
        ImageView avatarView = new ImageView();
        avatarView.setFitHeight(40);
        avatarView.setFitWidth(40);
        avatarView.getStyleClass().add("assistant-avatar");
        
        try {
            InputStream iconStream = getClass().getResourceAsStream(assistant.getIconPath());
            if (iconStream != null) {
                Image avatar = new Image(iconStream);
                avatarView.setImage(avatar);
            } else {
                System.err.println("无法加载助手图标: " + assistant.getIconPath());
                // 使用默认图标
                InputStream defaultIconStream = getClass().getResourceAsStream("/com/aiassistant/images/ai.png");
                if (defaultIconStream != null) {
                    avatarView.setImage(new Image(defaultIconStream));
                }
            }
        } catch (Exception e) {
            System.err.println("加载助手图标时出错: " + e.getMessage());
        }
        
        // 助手名称和模型信息
        VBox nameBox = new VBox(2);
        Label nameLabel = new Label(assistant.getName());
        nameLabel.getStyleClass().add("assistant-name");
        
        Label modelLabel = new Label(assistant.getModelType());
        modelLabel.getStyleClass().add("assistant-model");
        
        nameBox.getChildren().addAll(nameLabel, modelLabel);
        HBox.setHgrow(nameBox, Priority.ALWAYS);
        
        // 组装头部
        header.getChildren().addAll(avatarView, nameBox);
        
        // 助手描述
        Label descLabel = new Label(assistant.getDescription());
        descLabel.getStyleClass().add("assistant-desc");
        descLabel.setWrapText(true);
        
        // 组装卡片
        card.getChildren().addAll(header, descLabel);
        
        // 点击事件 - 选择该助手
        card.setOnMouseClicked(e -> selectAssistant(assistant));
        
        return card;
    }
    
    /**
     * 选择助手
     */
    private void selectAssistant(Assistant assistant) {
        // 更新当前选中的助手
        currentAssistant = assistant;
        
        // 显示聊天界面
        showChatView();
        
        // 添加助手欢迎消息
        addMessageToChat("AI助手", "您已选择 " + assistant.getName() + "，有什么我可以帮助您的吗？", true);
    }
    
    /**
     * 创建新助手
     */
    private void createNewAssistant() {
        // 这里应该显示创建新助手的对话框
        // 目前暂时显示未实现提示
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("功能开发中");
        alert.setHeaderText("创建自定义智能体");
        alert.setContentText("此功能正在开发中，敬请期待！");
        alert.showAndWait();
    }
    
    /**
     * 设置导航按钮事件
     */
    private void setupNavButtons() {
        chatNavButton.setOnMouseClicked(event -> {
            setNavActive(chatNavButton);
            showChatView();
        });
        
        appNavButton.setOnMouseClicked(event -> {
            setNavActive(appNavButton);
            showAppView();
        });
        
        favoriteNavButton.setOnMouseClicked(event -> {
            setNavActive(favoriteNavButton);
            showFavoriteView();
        });
        
        settingsNavButton.setOnMouseClicked(event -> {
            setNavActive(settingsNavButton);
            showSettingsView();
        });
    }
    
    /**
     * 设置导航按钮为激活状态
     */
    private void setNavActive(VBox navButton) {
        // 移除所有导航按钮的active类
        for (Node node : navButton.getParent().getChildrenUnmodifiable()) {
            if (node instanceof VBox) {
                node.getStyleClass().remove("active");
            }
        }
        
        // 添加active类到当前按钮
        navButton.getStyleClass().add("active");
    }
    
    /**
     * 设置分类标签事件
     */
    private void setupTabButtons() {
        myTabButton.setOnMouseClicked(event -> {
            setTabActive(myTabButton);
            filterAssistantsByCategory("我的");
        });
        
        featuredTabButton.setOnMouseClicked(event -> {
            setTabActive(featuredTabButton);
            filterAssistantsByCategory("精选");
        });
        
        careerTabButton.setOnMouseClicked(event -> {
            setTabActive(careerTabButton);
            filterAssistantsByCategory("职业");
        });
    }
    
    /**
     * 设置标签为激活状态
     */
    private void setTabActive(Label tabButton) {
        // 移除所有标签的active类
        for (Node node : ((HBox) tabButton.getParent()).getChildren()) {
            if (node instanceof Label) {
                node.getStyleClass().remove("active");
            }
        }
        
        // 添加active类到当前标签
        tabButton.getStyleClass().add("active");
    }
    
    /**
     * 根据分类筛选助手
     */
    private void filterAssistantsByCategory(String category) {
        // 清空助手列表
        assistantListContainer.getChildren().clear();
        
        // 添加匹配分类的助手
        for (Assistant assistant : assistants) {
            if (category.equals(assistant.getCategory())) {
                Node card = createAssistantCard(assistant);
                assistantListContainer.getChildren().add(card);
            }
        }
    }
    
    /**
     * 设置消息处理相关事件
     */
    private void setupMessageHandling() {
        // 发送按钮事件
        sendButton.setOnAction(event -> sendMessage());
        
        // 附件按钮事件
        attachButton.setOnAction(event -> uploadImage());
        
        // Ctrl+Enter发送消息
        userInputArea.setOnKeyPressed(event -> {
            if (event.isControlDown() && event.getCode().toString().equals("ENTER")) {
                sendMessage();
                event.consume();
            }
        });
    }
    
    /**
     * 发送消息
     */
    private void sendMessage() {
        String userMessage = userInputArea.getText().trim();
        if (userMessage.isEmpty()) {
            return;
        }
        
        // 添加用户消息到聊天界面
        addMessageToChat("用户", userMessage, false);
        
        // 清空输入框
        userInputArea.clear();
        
        // 显示加载指示器
        progressIndicator.setVisible(true);
        
        // 获取当前使用的模型
        AIModelInterface currentModel = modelManager.getCurrentModel();
        
        // 异步获取AI回复
        CompletableFuture.supplyAsync(() -> currentModel.getResponse(userMessage).join())
            .thenAccept(aiResponse -> {
                Platform.runLater(() -> {
                    // 添加AI回复到聊天界面
                    addMessageToChat(currentAssistant.getName(), aiResponse, true);
                    // 隐藏加载指示器
                    progressIndicator.setVisible(false);
                });
            });
    }
    
    /**
     * 上传图片
     */
    private void uploadImage() {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("选择图片");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("图片文件", "*.png", "*.jpg", "*.jpeg", "*.gif")
        );
        
        File selectedFile = fileChooser.showOpenDialog(attachButton.getScene().getWindow());
        if (selectedFile != null) {
            // 显示加载指示器
            progressIndicator.setVisible(true);
            
            // 添加图片消息到聊天界面
            addImageToChat("用户", selectedFile.getAbsolutePath());
            
            // 获取当前使用的模型
            AIModelInterface currentModel = modelManager.getCurrentModel();
            
            // 异步处理图片并获取AI回复
            CompletableFuture.supplyAsync(() -> currentModel.analyzeImage(selectedFile).join())
                .thenAccept(aiResponse -> {
                    Platform.runLater(() -> {
                        // 添加AI回复到聊天界面
                        addMessageToChat(currentAssistant.getName(), aiResponse, true);
                        // 隐藏加载指示器
                        progressIndicator.setVisible(false);
                    });
                });
        }
    }
    
    /**
     * 添加文本消息到聊天界面
     */
    private void addMessageToChat(String sender, String message, boolean isAI) {
        VBox messageBox = new VBox(5);
        messageBox.getStyleClass().add("message-box");
        
        // 消息头部：发送者和头像
        HBox headerBox = new HBox(8);
        headerBox.setAlignment(javafx.geometry.Pos.CENTER_LEFT);
        
        // 加载发送者头像
        ImageView senderImageView = new ImageView();
        senderImageView.setFitWidth(24);
        senderImageView.setFitHeight(24);
        
        try {
            String iconPath = isAI ? "/com/aiassistant/images/ai.png" : "/com/aiassistant/images/user.png";
            InputStream iconStream = getClass().getResourceAsStream(iconPath);
            if (iconStream != null) {
                Image senderImage = new Image(iconStream);
                senderImageView.setImage(senderImage);
            }
        } catch (Exception e) {
            System.err.println("加载发送者图标时出错: " + e.getMessage());
        }
        
        // 发送者名称
        Label senderLabel = new Label(sender + ":");
        senderLabel.getStyleClass().add("sender-label");
        
        headerBox.getChildren().addAll(senderImageView, senderLabel);
        
        // 消息内容
        TextArea messageArea = new TextArea(message);
        messageArea.setEditable(false);
        messageArea.setWrapText(true);
        messageArea.getStyleClass().add(isAI ? "ai-message" : "user-message");
        messageArea.getStyleClass().add("message-bubble");
        
        // 设置合适的高度
        messageArea.setPrefRowCount(Math.min(10, message.split("\n").length + 1));
        
        // 组装消息框
        messageBox.getChildren().addAll(headerBox, messageArea);
        
        // 添加到容器中
        chatMessagesContainer.getChildren().add(messageBox);
        
        // 自动滚动到底部
        Platform.runLater(() -> chatScrollPane.setVvalue(1.0));
    }
    
    /**
     * 添加图片消息到聊天界面
     */
    private void addImageToChat(String sender, String imagePath) {
        VBox messageBox = new VBox(5);
        messageBox.getStyleClass().add("message-box");
        
        // 消息头部：发送者和头像
        HBox headerBox = new HBox(8);
        headerBox.setAlignment(javafx.geometry.Pos.CENTER_LEFT);
        
        // 加载发送者头像
        try {
            InputStream iconStream = getClass().getResourceAsStream("/com/aiassistant/images/user.png");
            if (iconStream != null) {
                Image senderImage = new Image(iconStream);
                ImageView senderImageView = new ImageView(senderImage);
                senderImageView.setFitWidth(24);
                senderImageView.setFitHeight(24);
                headerBox.getChildren().add(senderImageView);
            }
        } catch (Exception e) {
            System.err.println("加载发送者图标时出错: " + e.getMessage());
        }
        
        // 发送者名称
        Label senderLabel = new Label(sender + ":");
        senderLabel.getStyleClass().add("sender-label");
        headerBox.getChildren().add(senderLabel);
        
        // 图片视图
        ImageView imageView = new ImageView(new Image("file:" + imagePath));
        imageView.setFitWidth(300);
        imageView.setPreserveRatio(true);
        
        // 组装消息框
        messageBox.getChildren().addAll(headerBox, imageView);
        
        // 添加到容器中
        chatMessagesContainer.getChildren().add(messageBox);
        
        // 自动滚动到底部
        Platform.runLater(() -> chatScrollPane.setVvalue(1.0));
    }
    
    /**
     * 显示聊天视图
     */
    private void showChatView() {
        // 显示聊天容器，隐藏其他
        for (Node node : contentContainer.getChildren()) {
            node.setVisible(false);
        }
        
        // 找到并显示聊天容器
        for (Node node : contentContainer.getChildren()) {
            if (node instanceof VBox && node.getStyleClass().contains("chat-container")) {
                node.setVisible(true);
                break;
            }
        }
        
        // 如果找不到，创建新的聊天容器
        if (contentContainer.getChildren().stream()
                .noneMatch(node -> node instanceof VBox && node.getStyleClass().contains("chat-container"))) {
            System.err.println("聊天容器不存在，请检查FXML布局");
        }
    }
    
    /**
     * 显示应用视图
     */
    private void showAppView() {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("功能开发中");
        alert.setHeaderText("应用功能");
        alert.setContentText("应用功能正在开发中，敬请期待！");
        alert.showAndWait();
    }
    
    /**
     * 显示收藏视图
     */
    private void showFavoriteView() {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("功能开发中");
        alert.setHeaderText("收藏功能");
        alert.setContentText("收藏功能正在开发中，敬请期待！");
        alert.showAndWait();
    }
    
    /**
     * 显示设置视图
     */
    private void showSettingsView() {
        try {
            // 加载设置视图FXML
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/aiassistant/view/settings.fxml"));
            Parent settingsRoot = loader.load();
            
            // 加载CSS样式
            settingsRoot.getStylesheets().add(getClass().getResource("/com/aiassistant/styles/settings.css").toExternalForm());
            
            // 隐藏所有内容
            for (Node node : contentContainer.getChildren()) {
                node.setVisible(false);
            }
            
            // 更新设置面板
            settingsPane.setCenter(settingsRoot);
            settingsPane.setVisible(true);
            
        } catch (IOException e) {
            System.err.println("无法加载设置视图: " + e.getMessage());
            e.printStackTrace();
            
            // 如果无法加载，显示错误提示
            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("错误");
            alert.setHeaderText("无法加载设置");
            alert.setContentText("加载设置界面时出错: " + e.getMessage());
            alert.showAndWait();
        }
    }
} 